/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.ufpb.halloc.dados;

import br.com.ufpb.halloc.conexaoDB.Pool;
import br.com.ufpb.halloc.conexaoDB.PoolIF;
import br.com.ufpb.halloc.exceptions.ProjetoInexistenteException;
import br.com.ufpb.halloc.exceptions.ProjetoInvalidoException;
import br.com.ufpb.halloc.exceptions.ProjetoVazioException;
import br.com.ufpb.halloc.negocio.Projeto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author kawe
 */
public class ProjetoDAOPostgreSQL implements ProjetoDAO{
    
    private static ProjetoDAOPostgreSQL daoProjetoPostgreSQL;
    private PoolIF pool;
    
    public ProjetoDAOPostgreSQL(){
        this.pool = new Pool();
    }
    
    
    public static ProjetoDAOPostgreSQL getInstance(){
        
        if(daoProjetoPostgreSQL == null){
            return new ProjetoDAOPostgreSQL();
            
        }else{
            return daoProjetoPostgreSQL;
        }
        
    }

    @Override
    public void inserir(Projeto projeto) throws ProjetoVazioException {
        
        Connection connection = this.pool.getConnection();
        PreparedStatement prepared;
        String sqlInsert = "INSERT INTO projeto (nomeprojeto, descricao, matprofessor, codprojeto) VALUES(?, ?, ?, ?);";
        
        if(projeto != null){
            try {
            prepared = connection.prepareStatement(sqlInsert);
            prepared.setString(1, projeto.getNome());
            prepared.setString(2, projeto.getDescricao());
            prepared.setString(3, projeto.getMatriculaProfessor());
            prepared.setString(4, projeto.getId());
            prepared.execute();
            prepared.close();
        } catch (SQLException ex) {
            Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            pool.liberarConnection(connection);
        }
        }else{
            throw new ProjetoVazioException("Projeto Vazio");
        }    
        
    }

    @Override
    public void remover(Projeto projeto) throws ProjetoInexistenteException {
        
        Connection connection = pool.getConnection();
        PreparedStatement prepared;
        
        
        try {
            prepared = connection.prepareStatement("DELETE FROM projeto WHERE nomeprojeto=?;");
            prepared.setString(1, projeto.getNome());
            prepared.executeUpdate();
            prepared.close();
        } catch (SQLException ex) {
            Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, ex);
        } finally{
            pool.liberarConnection(connection);
        }
        
    }
    
    public void removerPorId(String id){
        
        Connection con = pool.getConnection();
        PreparedStatement ps;
        String sqlDelete = "DELETE FROM projeto WHERE codprojeto = '" +id+ "';";
        try {
            ps = con.prepareStatement(sqlDelete);
            ps.executeUpdate();
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            this.pool.liberarConnection(con);
        }
    }

    @Override
    public Projeto pesquisarID(String id) throws ProjetoInexistenteException {
        
        PreparedStatement prepared;
        Connection connection = this.pool.getConnection();
        Projeto p = new Projeto();
        if(id != null){
            try {
            prepared = connection.prepareStatement("SELECT * FROM projeto WHERE codprojeto = '"+id +"';");
            ResultSet result = prepared.executeQuery();
            
            while(result.next()){
                p.setNome(result.getString("nomeprojeto"));
                p.setDescricao(result.getString("descricao"));
                p.setMatriculaProfessor(result.getString("matprofessor"));
                p.setId(result.getString("codprojeto"));
            }
            if(p==null){
                throw new ProjetoInexistenteException("Não existe projeto com esse Id: " + id +" Cadastrado");
            }
            
            prepared.close();
            } catch (SQLException e) {
                Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, e);
            }finally{
                this.pool.liberarConnection(connection);
            }
        }else{
            throw new ProjetoVazioException("Projeto Vazio");
        }
        return  p;
    }

    
    
    @Override
    public List<Projeto> pesquisar(String nome)  {
        
        List<Projeto> projetos = new ArrayList<Projeto>();
        Connection connection = pool.getConnection();
        try {
            PreparedStatement prepared = connection.prepareStatement("SELECT * FROM projeto WHERE LOWER(nomeprojeto) LIKE '"+nome.toLowerCase()+"%';");
            ResultSet result = prepared.executeQuery();
            while(result.next()){
                Projeto projeto = new Projeto(result.getString("nomeprojeto"), result.getString("descricao"), result.getString("matprofessor"), result.getString("codprojeto"));
                projetos.add(projeto);
            }
            prepared.close();
            
        } catch (SQLException ex) {
            Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            this.pool.liberarConnection(connection);
        }
        return  projetos;
    }

    @Override
    public void atualizar(Projeto projeto) throws ProjetoInexistenteException {
        Connection connection = this.pool.getConnection();
        PreparedStatement prepared;
        String sqlUpdate = "UPDATE projeto SET codprojeto = '" + projeto.getId()+"'"
                            + ", nomeprojeto = '" + projeto.getNome() + "'"
                            + ", descricao = '" + projeto.getDescricao() +"'"
                            + ", matprofessor = '"+ projeto.getMatriculaProfessor() + "' WHERE codprojeto = '" + projeto.getId()+"' and matprofessor = '"+projeto.getMatriculaProfessor()+"';";
        try {
            prepared = connection.prepareStatement(sqlUpdate);
            
            prepared.executeUpdate();
            prepared.close();
            
        } catch (SQLException ex) {
            Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, ex);
            throw  new ProjetoInexistenteException("Verifique se o projeto esta vazio antes de atualizar");
        }finally{
            this.pool.liberarConnection(connection);
        }
        
        
        
    }
    
    public List<Projeto> getProjetos(){
        Connection connection = this.pool.getConnection();
        PreparedStatement prepared;
        ResultSet result;
        List<Projeto> projetos = new ArrayList<Projeto>();
        String sqlGet = "SELECT * FROM projeto";
        try {
            prepared = connection.prepareStatement(sqlGet);
            result = prepared.executeQuery();
            Projeto projeto;
            while(result.next()){
                projeto = new Projeto();
                projeto.setNome(result.getString("nomeprojeto"));
                projeto.setDescricao(result.getString("descricao"));
                projeto.setMatriculaProfessor(result.getString("matprofessor"));
                projeto.setId(result.getString("codprojeto"));
                projetos.add(projeto);
            }
            prepared.close();
            
        } catch (SQLException ex) {
            Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            this.pool.liberarConnection(connection);
        }
        
        
        
        return projetos;
    }
    
    public int getQuantidadeDeProjetos(String matricula){
        int quant =0;
        String sql = "SELECT COUNT(*) as quantidade FROM projeto WHERE matprofessor = '"+matricula+"'";
        Connection con = this.pool.getConnection();
        try {
            PreparedStatement pr = con.prepareStatement(sql);
            ResultSet set = pr.executeQuery();
            set.next();
            quant = set.getInt("quantidade");
            pr.close();
            
        } catch (SQLException ex) {
            Logger.getLogger(ProjetoDAOPostgreSQL.class.getName()).log(Level.SEVERE, null, ex);
        }finally{
            this.pool.liberarConnection(con);
        } 
        
        return quant;
    }
    
}
